package mgoasync

import (
	"container/list"
	"sync"
	"time"
)

// MongoDB 的操作
const (
	OPUpdate = `update`
	OPInsert = `insert`
)

// Act MongoDB 数据库最近一次操作的统计数据
type Act struct {
	OP         string
	StartTime  time.Time // 开始的时间
	PackTime   time.Time // 完成打包时间
	FinishTime time.Time // 完成更新时间
	Count      int       // 更新的文档数量
	UpdateKeys int       // 更新的字段数量
	DeleteKeys int       // 删除的字段数量
	Err        error     // 发生错误
}

var mongoRecentAct = struct {
	sync.RWMutex
	acts map[string]*list.List
}{
	acts: make(map[string]*list.List),
}

// MongoAddUpdate 发生了新的 MongoDB 数据库更新操作
func addStatistics(name string, data *Act) {
	mongoRecentAct.Lock()
	defer mongoRecentAct.Unlock()
	l, ok := mongoRecentAct.acts[name]
	if !ok {
		l = list.New()
		mongoRecentAct.acts[name] = l
	}
	l.PushFront(data)
	for l.Len() > 100 {
		l.Remove(l.Back())
	}
}

// GetStatisticNames 获取统计的操作目标名称
func GetStatisticNames() []string {
	mongoRecentAct.RLock()
	defer mongoRecentAct.RUnlock()
	res := make([]string, 0, len(mongoRecentAct.acts))
	for name := range mongoRecentAct.acts {
		res = append(res, name)
	}
	return res
}

// GetActs 获取指定目标 name 的最近 count 条统计数据
func GetActs(name string, count int) []Act {
	mongoRecentAct.RLock()
	defer mongoRecentAct.RUnlock()
	copy := make([]Act, 0, count)
	l, ok := mongoRecentAct.acts[name]
	if !ok {
		return copy
	}
	i := 0
	for cur := l.Front(); cur != nil; cur = cur.Next() {
		data := cur.Value.(*Act)
		copy = append(copy, *data)
		i++
		if i >= count {
			break
		}
	}
	return copy
}
